﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Data.SqlClient;
using System.Data.Objects;
using BABELE_SISMModel;
using log4net;
using log4net.Config;
using System.Configuration;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Threading;
using System.Web.Hosting;
using System.Security.Permissions;
using System.ServiceModel.Activation;
using System.Security.Principal;
using System.ServiceModel.Channels;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using System.Xml.Serialization;
using System.Xml.XPath;
using System.Web;
using CSI.BABELE.WebServices.Model;
using CSI.BABELE.WebServices.DLayer;
using System.Transactions;
using ServiceSismWS;

namespace CSI.BABELE.WebServices.BLayer
{
    public class DAOServices : IDAOServices
    {
        #region Local variables

        private static log4net.ILog log;
        private static bool Validate_NotificaEvento;
        public static string current_GUID;

        #endregion

        #region GUID

        public void setGUID(string guid)
        {
            current_GUID = guid;
        }

        #endregion

        #region IsAlive

        public bool IsAlive()
        {
            bool ret = false;

            try
            {
                #region LOG

                LOGHelp.LoadLog4NeFromCongif();

                //Leggo la sezione di appender per il file di log specifico per il servizio
                log = log4net.LogManager.GetLogger("Servizio");

                #endregion

                log.Debug("START: *********public bool IsAlive()*********");

                #region T_SQL: Add new row into UTBG_AURA_NOTIFICHE table

                BABELE_SISMEntities context = new BABELE_SISMEntities();
                UTBG_AURA_NOTIFICHE elementAdd = new UTBG_AURA_NOTIFICHE();

                elementAdd.NOTE = string.Format("Process: IsAlive");
                elementAdd.DATA = DateTime.Now;

                ////Access By Entity Framework
                context.AddToUTBG_AURA_NOTIFICHE(elementAdd);
                context.SaveChanges();

                #endregion

                log.Debug("T_SQL: Inserimento in UTBG_AURA_NOTIFICHE effettuato con successo.");

                ret = true;
            }
            catch (SqlException exSql)
            {
                log.Error("ERROR Type SqlExcetion: " + exSql.InnerException.ToString());
            }
            catch (Exception ex)
            {
                log.Error("ERROR Type Excetion: " + ex.InnerException.ToString());
            }
            finally
            {
                log.Debug("STOP: *********public bool IsAlive()*********");
            }

            return ret;

        }

        #endregion

        #region Serialize / Deserialize

        public static String SerializeToXmlString(object targetInstance)
        {
            string retVal = string.Empty;

            TextWriter writer = new StringWriter();
            XmlSerializer serializer = new XmlSerializer(targetInstance.GetType());
            serializer.Serialize(writer, targetInstance);
            retVal = writer.ToString();

            return retVal;
        }

        public static object DeserializeFromXmlString(string objectXml, Type targetType)
        {
            object retVal = null;

            XmlSerializer serializer = new XmlSerializer(targetType);
            StringReader stringReader = new StringReader(objectXml);
            XmlTextReader xmlReader = new XmlTextReader(stringReader);
            retVal = serializer.Deserialize(xmlReader);

            return retVal;
        }

        #endregion

        #region Validate
        /// <summary>
        /// Validate SCHEMA "Schema\NotificaEventoAURA.xsd"
        /// </summary>
        /// <param name="targetInstance">object Instance</param>
        /// <param name="schemaPath">Es: Schema\NotificaEventoAURA.xsd</param>
        /// <returns></returns>
        public static bool Validate(object targetInstance, string schemaPath)
        {
            Validate_NotificaEvento = true;

            string virtualDir = HttpRuntime.AppDomainAppPath;

            /****************************************/
            //string xsd = virtualDir + @"Schema\NotificaEventoAURA.xsd";
            string xsd = virtualDir + schemaPath;
            /****************************************/

            XmlReaderSettings settings = new XmlReaderSettings();
            //settings.Schemas.Add("http://CheckService.central.services.auraws.aura.csi.it", xsd);
            /****************************************/
            settings.Schemas.Add("", xsd);
            /****************************************/
            settings.ValidationType = ValidationType.Schema;

            String xml = SerializeToXmlString(targetInstance);

            settings.ValidationEventHandler += new ValidationEventHandler(Settings_ValidationEventHandler);

            XmlReader reader = XmlReader.Create(new StringReader(xml), settings);
            XmlDocument document = new XmlDocument();

            document.Load(reader);

            return Validate_NotificaEvento;
        }

        /// <summary>
        /// Handler to Validate SCHEMA "Schema\NotificaEventoAURA.xsd"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void Settings_ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            Validate_NotificaEvento = false;

            #region LOG

            LOGHelp.LoadLog4NeFromCongif();

            //Leggo la sezione di appender per il file di log specifico per il servizio
            log = log4net.LogManager.GetLogger("Servizio");

            #endregion

            string strErrorMsg = "";

            if (e.Severity == XmlSeverityType.Warning)
                strErrorMsg += "WARNING: ";
            else
                strErrorMsg += "ERROR: ";

            strErrorMsg += e.Exception.Message + @"\r\n";

            SOAP_Integrazione_ErrorDetail(current_GUID, strErrorMsg, "XSD VALIDATION");
        }

        #endregion

        #region messaggioSIO: BABELE vs NOEMALIFE (Laboratorio analisi)

        /// <summary>
        /// Metododo di estrazione della richiesta per il LAB.Analisi con fornitore NOEMALIFE
        /// </summary>
        /// <param name="idRichiesta"></param>
        /// <returns></returns>
        public static string messaggioSIO(int idRichiesta, string type)
        {
            SqlParameter[] inputParam = new SqlParameter[2];

            inputParam[0] = new SqlParameter("RICHIESTA", System.Data.SqlDbType.Int);
            inputParam[0].Value = idRichiesta;

            inputParam[1] = new SqlParameter("TYPE", System.Data.SqlDbType.Char, 3);
            inputParam[1].Value = type;

            #region CONTEXT

            BABELE_SISMEntities context = new BABELE_SISMEntities();

            #endregion

            #region Eseguo la Stored Procedure di estrazione dati per NOEMALIFE

            var get_WSO2_OML_O21 = BabeleSqlHelper.ExecuteStoredProcedure_ToString<string>(context, "bab_util_BABELE_DIPARTIMENTALI", inputParam);

            if (get_WSO2_OML_O21.ToString().Equals(""))
                throw new Exception("Si sono verificati errori durante l'estrazione dei dati; contattare l'amministratore del sistema.");

            return get_WSO2_OML_O21.ToString();

            #endregion

        }

        #endregion

        #region LOG dei messaggi SOAP: SOAP_Integrazione_log

        /// <summary>
        /// Nuovo record su tabella SOAP_Integrazione_log
        /// </summary>
        /// <param name="DATA_INVIO"></param>
        /// <param name="SOAP_MSG"></param>
        /// <param name="SOAP_GUID"></param>
        /// <returns></returns>
        public static void SOAP_Integrazione_log(string envelopeIN)
        {
            #region LOG

            LOGHelp.LoadLog4NeFromCongif();

            //Leggo la sezione di appender per il file di log specifico per il servizio
            log = log4net.LogManager.GetLogger("Servizio");

            #endregion

            #region T_SQL

            BABELE_SISMEntities context = new BABELE_SISMEntities();
            SOAP_Integrazione_log elementAdd = new SOAP_Integrazione_log();

            elementAdd.DATA_INVIO = DateTime.Now;
            elementAdd.SOAP_GUID = current_GUID;
            elementAdd.SOAP_MSG = envelopeIN;

            context.AddToSOAP_Integrazione_log(elementAdd);
            context.SaveChanges();

            #endregion
        }

        #endregion

        #region LOG degli errori SOAP: SOAP_Integrazione_ErrorDetail

        /// <summary>
        /// Nuovo record su tabella SOAP_Integrazione_ErrorDetail
        /// </summary>
        /// <param name="SOAP_GUID"></param>
        /// <param name="ERROR_DESCRIPTION"></param>
        /// <param name="ERROR_TYPE"></param>
        /// <returns></returns>
        private static void SOAP_Integrazione_ErrorDetail(string guid, string description, string type)
        {
            #region T_SQL

            BABELE_SISMEntities context = new BABELE_SISMEntities();
            SOAP_Integrazione_ErrorDetail errorAdd = new SOAP_Integrazione_ErrorDetail();

            errorAdd.SOAP_GUID = guid;
            errorAdd.ERROR_DESCRIPTION = description;
            errorAdd.ERROR_TYPE = type;

            context.AddToSOAP_Integrazione_ErrorDetail(errorAdd);
            context.SaveChanges();

            #endregion
        }

        #endregion

        #region IsAuthenticated

        public static bool IsAuthenticated(string userName, string password)
        {
            bool isAuthenticated = false;

            try
            {
                #region LOG

                LOGHelp.LoadLog4NeFromCongif();

                //Leggo la sezione di appender per il file di log specifico per il servizio
                log = log4net.LogManager.GetLogger("Servizio");

                #endregion

                log.Debug("START: *********public bool IsAuthenticated()*********");

                #region T_SQL: Confronto la pwd di autenticazione con quella archiviata in base dati.

                BABELE_SISMEntities context = new BABELE_SISMEntities();
                SOAP_INTEGRA_ADMIN admTable = new SOAP_INTEGRA_ADMIN();

                IQueryable<SOAP_INTEGRA_ADMIN> tblSOAP_INTEGRA_ADMIN = from admin in context.SOAP_INTEGRA_ADMIN select admin;
                IQueryable<SOAP_INTEGRA_ADMIN> resultset_SOAP_INTEGRA_ADMIN = tblSOAP_INTEGRA_ADMIN.Where(admin => admin.bab_integra_user == userName);

                string pwdDecrypt = "";
                foreach (var singleUsernameTable in resultset_SOAP_INTEGRA_ADMIN)
                {
                    pwdDecrypt = StringCipher.Decrypt(singleUsernameTable.bab_integra_password, ENUM.COSTANTE_CIFRATURA);
                    break;
                }
                

                /*                      ARCHIVIO LA PASSWORD OPPORTUNAMENTE CIFRATA NELLA BASE DATI
                 * 
                    string password = "miapassword";
                    string passwordEncrypt = StringCipher.Encrypt(password, ENUM.COSTANTE_CIFRATURA));
                    
                 */
                if (pwdDecrypt.Equals(password))
                    isAuthenticated = true;

                #endregion
            }
            catch (SqlException exSql)
            {
                log.Error("ERROR Type SqlExcetion: " + exSql.InnerException.ToString());
            }
            catch (Exception ex)
            {
                log.Error("ERROR Type Excetion: " + ex.InnerException.ToString());
            }
            finally
            {
                log.Debug("STOP: *********public bool IsAuthenticated()*********");
            }

            return isAuthenticated;

        }

        #endregion

        #region SaveUsernamePassword

        public static void SaveUsernamePassword(string userName, string password)
        {
            try
            {
                #region LOG

                LOGHelp.LoadLog4NeFromCongif();

                //Leggo la sezione di appender per il file di log specifico per il servizio
                log = log4net.LogManager.GetLogger("Servizio");

                #endregion
                log.Debug("START: *********public bool SaveUsernamePassword()*********");

                #region T_SQL: Inserisco una nuova Key nella tabella amministrativa

                BABELE_SISMEntities context = new BABELE_SISMEntities();
                SOAP_INTEGRA_ADMIN admTable = new SOAP_INTEGRA_ADMIN();

                IQueryable<SOAP_INTEGRA_ADMIN> tblSOAP_INTEGRA_ADMIN = from admin in context.SOAP_INTEGRA_ADMIN select admin; 
                IQueryable<SOAP_INTEGRA_ADMIN> resultset_SOAP_INTEGRA_ADMIN = tblSOAP_INTEGRA_ADMIN.Where(admin => admin.bab_integra_user == userName);

                bool firstAccess = true;
                string pwdEncrypt = StringCipher.Encrypt(password, ENUM.COSTANTE_CIFRATURA);
                admTable.bab_integra_user = userName;
                admTable.bab_integra_password = pwdEncrypt;

                foreach (var singleUsernameTable in resultset_SOAP_INTEGRA_ADMIN)
                {
                    firstAccess = false;
                    break;
                }

                if(firstAccess)
                {
                    context.AddToSOAP_INTEGRA_ADMIN(admTable);
                    context.SaveChanges();
                }

                #endregion
            }
            catch (SqlException exSql)
            {
                log.Error("ERROR Type SqlExcetion: " + exSql.InnerException.ToString());
            }
            catch (Exception ex)
            {
                log.Error("ERROR Type Excetion: " + ex.InnerException.ToString());
            }
            finally
            {
                log.Debug("STOP: *********public bool SaveUsernamePassword()*********");
            }
        }

        #endregion

        #region ScorriEventi()
        public void ScorriEventi()
        {
            XPathNavigator nav;
            XPathDocument docNav;
            XPathNodeIterator NodeIter;
            BABELE_SISMEntities context = new BABELE_SISMEntities();
            SISM_EVENTI_MESSAGGI admTable = new SISM_EVENTI_MESSAGGI();
            

            IQueryable<SISM_EVENTI_MESSAGGI> tblSISM_EVENTI_MESSAGGI;
            IQueryable<SISM_EVENTI_MESSAGGI> resultset_SISM_EVENTI_MESSAGGI;
            try
            {
                #region LOG

                LOGHelp.LoadLog4NeFromCongif();

                //Leggo la sezione di appender per il file di log specifico per il servizio
                log = log4net.LogManager.GetLogger("Servizio");

                #endregion
                log.Debug("START: *********public void ScorriEventi()*********");

                #region T_SQL: Leggo dalla tabella SISM_EVENTI_MESSASSI I RECORD CON "STATO" NULL

                tblSISM_EVENTI_MESSAGGI = from messaggi in context.SISM_EVENTI_MESSAGGI select messaggi;
                resultset_SISM_EVENTI_MESSAGGI = tblSISM_EVENTI_MESSAGGI.Where(messaggi => messaggi.STATO == null);

                bool firstAccess = true;
                string xml_out;
                SMRSRPClient client = null;

                foreach (var resMsg in resultset_SISM_EVENTI_MESSAGGI)
                {
                    firstAccess = false;
                    xml_out = resMsg.MESSAGIO_XML;
                    //todO CREO ISTANZA DELLe CLASSe DA INVIARE dall'xml letto dal db
                    StringReader rdr = new StringReader(xml_out);
                    // Open the XML.
                    docNav = new XPathDocument(rdr);
                    // Create a navigator to query with XPath.
                    nav = docNav.CreateNavigator();
                    if ("AT".Equals(resMsg.TIPO_INVIO))
                    {
                        NodeIter = nav.Select("/SetANAGT");
                        foreach (XPathNavigator anagt in NodeIter)
                        {
                            try
                            {
                                log.Debug("Sto operando sul record con id=" + resMsg.ID);
                                //Mittente
                                string xml_mitt = anagt.SelectSingleNode("Mittente").OuterXml.ToString();
                                object obj_mitt = DAOServices.DeserializeFromXmlString(xml_mitt, typeof(Mittente));
                                Mittente _mittente = (Mittente)obj_mitt;

                                //DatiIdentificativiScheda
                                string xml_datiIdentificativiScheda = anagt.SelectSingleNode("DatiIdentificativiScheda").OuterXml.ToString();
                                object obj_datiIdentificativiScheda = DAOServices.DeserializeFromXmlString(xml_datiIdentificativiScheda, typeof(DatiIdentificativiScheda));
                                DatiIdentificativiScheda _datiIdentificativiScheda = (DatiIdentificativiScheda)obj_datiIdentificativiScheda;

                                //CampoTecnicoTipoMovimento
                                string xml_campoTecnicoTipoMovimento = anagt.SelectSingleNode("CampoTecnicoTipoMovimento/TipoMovimento").OuterXml.ToString();
                                object obj_campoTecnicoTipoMovimento = DAOServices.DeserializeFromXmlString(xml_campoTecnicoTipoMovimento, typeof(TipoMovimento));
                                TipoMovimento _campoTecnicoTipoMovimento = (TipoMovimento)obj_campoTecnicoTipoMovimento;

                                //DatiAssistitoElement
                                string xml_datiAssistito = anagt.SelectSingleNode("DatiAssistitoElement").OuterXml.ToString();
                                object obj_datiAssistito = DAOServices.DeserializeFromXmlString(xml_datiAssistito, typeof(DatiAssistitoElement));
                                DatiAssistitoElement _datiAssistito = (DatiAssistitoElement)obj_datiAssistito;

                                //TipoFlusso
                                string xml_campoTecnicoTipoFlusso = anagt.SelectSingleNode("CampoTecnicoTipoFlusso/TipoFlusso").OuterXml.ToString();
                                object obj_campoTecnicoTipoFlusso = DAOServices.DeserializeFromXmlString(xml_campoTecnicoTipoFlusso, typeof(TipoFlusso));
                                TipoFlusso _campoTecnicoTipoFlusso = (TipoFlusso)obj_campoTecnicoTipoFlusso;

                                //invoco il servizio
                                resMsg.STATO = 2;//Invio effettuato ma errore avvenuto durante l'invocazione 
                                client = new SMRSRPClient();
                                client.Endpoint.Address = new EndpointAddress("http://tst-spjb601-sl01.self.csi.it:18010/sisminvi/services");

                                //client.Endpoint.Address = new EndpointAddress("http://192.168.126.128:80/wso002/services/sismwso2.sismwso2HttpSoap11Endpoint"); 
                                //client.Endpoint.Address = new EndpointAddress("http://10.102.178.53:8280/services/sismwso2.sismwso2HttpSoap11Endpoint");
                                int p = client.SetANAGT(_mittente, _datiIdentificativiScheda, _campoTecnicoTipoMovimento, _datiAssistito, _campoTecnicoTipoFlusso);
                                log.Debug("*********public void ScorriEventi() SetANAGT********* wso2 uid=" + p);
                                // Salvi sulla tabella Mssaggi id e lo fleggo come  inviato
                                resMsg.WSUID = p;
                                resMsg.MESSAGGO_ERRORE = "";
                                resMsg.STATO = 1;//Invio effettuato esito ok
                            }
                            catch (SqlException exSql)
                            {
                                resMsg.MESSAGGO_ERRORE = "Errore durante l'invio:" + ((exSql.InnerException != null) ? exSql.InnerException.ToString() : exSql.Message.ToString());
                                log.Error("ERROR Type SqlExcetion 2: " + resMsg.MESSAGGO_ERRORE);
                                break;
                            }
                            catch (Exception ex)
                            {

                                resMsg.MESSAGGO_ERRORE = "Errore durante l'invio:" + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString());
                                throw new System.Exception(resMsg.MESSAGGO_ERRORE);
                            }
                            //TODO devo verificare in caso non sia un messaggio di tipo angrafico se l'ultimo messaggio di tipo anagt è stato inviato correttamente altrimenti...

                        }
                    } else if ("AR".Equals(resMsg.TIPO_INVIO)) {
                         NodeIter = nav.Select("/SetANAGR");
                         foreach (XPathNavigator anagt in NodeIter)
                         {
                         }
                    } else if ("AS".Equals(resMsg.TIPO_INVIO)) {
                        NodeIter = nav.Select("/SetANAGS");
                        foreach (XPathNavigator anagt in NodeIter)
                        {
                        }
                    } else if ("CT".Equals(resMsg.TIPO_INVIO)) {
                        NodeIter = nav.Select("/SetCONTT");
                        foreach (XPathNavigator contt in NodeIter)
                        {
                            try
                            {
                                log.Debug("SetCONTT Sto operando sul record con id=" + resMsg.ID);
                                //Mittente
                                string xml_mitt = contt.SelectSingleNode("Mittente").OuterXml.ToString();
                                object obj_mitt = DAOServices.DeserializeFromXmlString(xml_mitt, typeof(Mittente));
                                Mittente _mittente = (Mittente)obj_mitt;

                                //DatiIdentificativiSchedaConStruttura
                                string xml_datiIdentificativiScheda = contt.SelectSingleNode("DatiIdentificativiSchedaConStruttura").OuterXml.ToString();
                                object obj_datiIdentificativiScheda = DAOServices.DeserializeFromXmlString(xml_datiIdentificativiScheda, typeof(DatiIdentificativiSchedaConStruttura));
                                DatiIdentificativiSchedaConStruttura _datiIdentificativiScheda = (DatiIdentificativiSchedaConStruttura)obj_datiIdentificativiScheda;

                                //PuntoDiErogazione
                                String xml_PuntoDiErogazione = contt.SelectSingleNode("PuntoDiErogazione").OuterXml.ToString();
                                object obj_PuntoDiErogazione = DAOServices.DeserializeFromXmlString(xml_PuntoDiErogazione, typeof(PuntoDiErogazione));
                                PuntoDiErogazione _PuntoDiErogazione = (PuntoDiErogazione)obj_PuntoDiErogazione;

                                //TipoMovimento
                                String xml_TipoMovimento = contt.SelectSingleNode("CampoTecnicoTipoMovimento/TipoMovimento").OuterXml.ToString();
                                object obj_TipoMovimento = DAOServices.DeserializeFromXmlString(xml_TipoMovimento, typeof(TipoMovimento));
                                TipoMovimento _TipoMovimento = (TipoMovimento)obj_TipoMovimento;

                                //DatiAssistitoLight
                                string xml_DatiAssistitoLight = contt.SelectSingleNode("DatiAssistitoLight").OuterXml.ToString();
                                object obj_DatiAssistitoLight = DAOServices.DeserializeFromXmlString(xml_DatiAssistitoLight, typeof(DatiAssistitoLight));
                                DatiAssistitoLight _DatiAssistitoLight = (DatiAssistitoLight)obj_DatiAssistitoLight;

                                //DatiAnagraficiAssistitiSenzaIdentificativoLight
                                string xml_DatiAnagraficiAssistitiSenzaIdentificativoLight = contt.SelectSingleNode("DatiAnagraficiAssistitiSenzaIdentificativoLight").OuterXml.ToString();
                                object obj_DatiAnagraficiAssistitiSenzaIdentificativoLight = DAOServices.DeserializeFromXmlString(xml_DatiAnagraficiAssistitiSenzaIdentificativoLight, typeof(DatiAnagraficiAssistitiSenzaIdentificativoLight));
                                DatiAnagraficiAssistitiSenzaIdentificativoLight _DatiAnagraficiAssistitiSenzaIdentificativoLight = (DatiAnagraficiAssistitiSenzaIdentificativoLight)obj_DatiAnagraficiAssistitiSenzaIdentificativoLight;

                                //DatiContatto
                                string xml_DatiContatto = contt.SelectSingleNode("DatiContatto").OuterXml.ToString();
                                object obj_DatiContatto = DAOServices.DeserializeFromXmlString(xml_DatiContatto, typeof(DatiContatto));
                                DatiContatto _DatiContatto = (DatiContatto)obj_DatiContatto;

                                //ContributiEconomiciAlPaziente lista
                                List<ContributiEconomiciAlPaziente> listaCont = new List<ContributiEconomiciAlPaziente>();
                                XPathNodeIterator listOfContEcoPaz = contt.Select("/SetCONTT//ContributiEconomiciAlPaziente");
                                foreach (XPathNavigator book in listOfContEcoPaz)
                                {
                                    String xml_cep = contt.SelectSingleNode("ContributiEconomiciAlPaziente").OuterXml.ToString();
                                    object obj_cep = DAOServices.DeserializeFromXmlString(xml_cep, typeof(ContributiEconomiciAlPaziente));
                                    listaCont.Add((ContributiEconomiciAlPaziente)obj_cep);
                                }

                                //TipoFlusso
                                string xml_campoTecnicoTipoFlusso = contt.SelectSingleNode("CampoTecnicoTipoFlusso/TipoFlusso").OuterXml.ToString();
                                object obj_campoTecnicoTipoFlusso = DAOServices.DeserializeFromXmlString(xml_campoTecnicoTipoFlusso, typeof(TipoFlusso));
                                TipoFlusso _campoTecnicoTipoFlusso = (TipoFlusso)obj_campoTecnicoTipoFlusso;

                                //invoco il servizio
                                resMsg.STATO = 2;//Invio effettuato ma errore avvenuto durante l'invocazione 
                                client = new SMRSRPClient();
                                client.Endpoint.Address = new EndpointAddress("http://tst-spjb601-sl01.self.csi.it:18010/sisminvi/services");
                                int u = client.SetCONTT(_mittente, _datiIdentificativiScheda, _PuntoDiErogazione, _TipoMovimento, _DatiAssistitoLight, _DatiAnagraficiAssistitiSenzaIdentificativoLight, _DatiContatto, listaCont.ToArray(), _campoTecnicoTipoFlusso);
                                log.Debug("*********public void ScorriEventi() SetCONTT ********* wso2 uid=" + u);
                                // Salvi sulla tabella Mssaggi id e lo fleggo come  inviato
                                resMsg.WSUID = u;
                                resMsg.MESSAGGO_ERRORE = "";
                                resMsg.STATO = 1;//Invio effettuato esito ok
                            }
                            catch (SqlException exSql)
                            {
                                resMsg.MESSAGGO_ERRORE = "Errore durante l'invio CONTT:" + ((exSql.InnerException != null) ? exSql.InnerException.ToString() : exSql.Message.ToString());
                                log.Error("ERROR Type SqlExcetion 2: " + resMsg.MESSAGGO_ERRORE);
                                break;
                            }
                            catch (Exception ex)
                            {

                                resMsg.MESSAGGO_ERRORE = "Errore durante l'invio CONTT:" + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString());
                                throw new System.Exception(resMsg.MESSAGGO_ERRORE);
                            }
                        }
                    }
                    else if ("CR".Equals(resMsg.TIPO_INVIO)) {
                        NodeIter = nav.Select("/SetCONTR");
                        foreach (XPathNavigator contt in NodeIter)
                        {
                        }
                    }
                    else if ("CS".Equals(resMsg.TIPO_INVIO)) {
                        NodeIter = nav.Select("/SetCONTS");
                        foreach (XPathNavigator contt in NodeIter)
                        {
                        }
                    }
                    else if ("PT".Equals(resMsg.TIPO_INVIO))
                    {
                        NodeIter = nav.Select("/SetPRESTT");
                        foreach (XPathNavigator contt in NodeIter)
                        {
                            try
                            {
                                log.Debug("SetPRESTT Sto operando sul record con id=" + resMsg.ID);
                                //Mittente
                                string xml_mitt = contt.SelectSingleNode("Mittente").OuterXml.ToString();
                                object obj_mitt = DAOServices.DeserializeFromXmlString(xml_mitt, typeof(Mittente));
                                Mittente _mittente = (Mittente)obj_mitt;

                                //DatiIdentificativiSchedaConStruttura
                                string xml_datiIdentificativiScheda = contt.SelectSingleNode("DatiIdentificativiSchedaConStruttura").OuterXml.ToString();
                                object obj_datiIdentificativiScheda = DAOServices.DeserializeFromXmlString(xml_datiIdentificativiScheda, typeof(DatiIdentificativiSchedaConStruttura));
                                DatiIdentificativiSchedaConStruttura _datiIdentificativiScheda = (DatiIdentificativiSchedaConStruttura)obj_datiIdentificativiScheda;

                                //PuntoDiErogazione
                                String xml_PuntoDiErogazione = contt.SelectSingleNode("PuntoDiErogazione").OuterXml.ToString();
                                object obj_PuntoDiErogazione = DAOServices.DeserializeFromXmlString(xml_PuntoDiErogazione, typeof(PuntoDiErogazione));
                                PuntoDiErogazione _PuntoDiErogazione = (PuntoDiErogazione)obj_PuntoDiErogazione;

                                //DatiAssistitoLight
                                string xml_DatiAssistitoLight = contt.SelectSingleNode("DatiAssistitoLight").OuterXml.ToString();
                                object obj_DatiAssistitoLight = DAOServices.DeserializeFromXmlString(xml_DatiAssistitoLight, typeof(DatiAssistitoLight));
                                DatiAssistitoLight _DatiAssistitoLight = (DatiAssistitoLight)obj_DatiAssistitoLight;

                                //DatiAnagraficiAssistitiSenzaIdentificativoLight
                                string xml_DatiAnagraficiAssistitiSenzaIdentificativoLight = contt.SelectSingleNode("DatiAnagraficiAssistitiSenzaIdentificativoLight").OuterXml.ToString();
                                object obj_DatiAnagraficiAssistitiSenzaIdentificativoLight = DAOServices.DeserializeFromXmlString(xml_DatiAnagraficiAssistitiSenzaIdentificativoLight, typeof(DatiAnagraficiAssistitiSenzaIdentificativoLight));
                                DatiAnagraficiAssistitiSenzaIdentificativoLight _DatiAnagraficiAssistitiSenzaIdentificativoLight = (DatiAnagraficiAssistitiSenzaIdentificativoLight)obj_DatiAnagraficiAssistitiSenzaIdentificativoLight;

                                //DatiContatto
                                string xml_DatiContatto = contt.SelectSingleNode("DatiContatto").OuterXml.ToString();
                                object obj_DatiContatto = DAOServices.DeserializeFromXmlString(xml_DatiContatto, typeof(DatiContatto));
                                DatiContatto _DatiContatto = (DatiContatto)obj_DatiContatto;

                                //TipoMovimento
                                String xml_TipoMovimento = contt.SelectSingleNode("CampoTecnicoTipoMovimento/TipoMovimento").OuterXml.ToString();
                                object obj_TipoMovimento = DAOServices.DeserializeFromXmlString(xml_TipoMovimento, typeof(TipoMovimento));
                                TipoMovimento _TipoMovimento = (TipoMovimento)obj_TipoMovimento;

                                //DatiDellaPrestazione
                                String xml_DatiDellaPrestazione = contt.SelectSingleNode("DatiDellaPrestazione").OuterXml.ToString();
                                object obj_DatiDellaPrestazione = DAOServices.DeserializeFromXmlString(xml_DatiDellaPrestazione, typeof(DatiDellaPrestazione));
                                DatiDellaPrestazione _DatiDellaPrestazione = (DatiDellaPrestazione)obj_DatiDellaPrestazione;

                                //DatiRicetta
                                String xml_DatiRicetta = contt.SelectSingleNode("DatiRicetta").OuterXml.ToString();
                                object obj_DatiRicetta = DAOServices.DeserializeFromXmlString(xml_DatiRicetta, typeof(DatiRicetta));
                                DatiRicetta _DatiRicetta = (DatiRicetta)obj_DatiRicetta;

                                //TipoFlusso
                                string xml_campoTecnicoTipoFlusso = contt.SelectSingleNode("CampoTecnicoTipoFlusso/TipoFlusso").OuterXml.ToString();
                                object obj_campoTecnicoTipoFlusso = DAOServices.DeserializeFromXmlString(xml_campoTecnicoTipoFlusso, typeof(TipoFlusso));
                                TipoFlusso _campoTecnicoTipoFlusso = (TipoFlusso)obj_campoTecnicoTipoFlusso;

                                //invoco il servizio
                                resMsg.STATO = 2;//Invio effettuato ma errore avvenuto durante l'invocazione 
                                client = new SMRSRPClient();
                                client.Endpoint.Address = new EndpointAddress("http://tst-spjb601-sl01.self.csi.it:18010/sisminvi/services");
                                int u = client.SetPRESTT(_mittente, _datiIdentificativiScheda, _PuntoDiErogazione, _DatiAssistitoLight, _DatiAnagraficiAssistitiSenzaIdentificativoLight, _DatiContatto, _TipoMovimento, _DatiDellaPrestazione, _DatiRicetta, _campoTecnicoTipoFlusso);
                                log.Debug("*********public void ScorriEventi() SetPRESTT ********* wso2 uid=" + u);
                                // Salvi sulla tabella Mssaggi id e lo fleggo come  inviato
                                resMsg.WSUID = u;
                                resMsg.MESSAGGO_ERRORE = "";
                                resMsg.STATO = 1;//Invio effettuato esito ok
                            }
                            catch (SqlException exSql)
                            {
                                resMsg.MESSAGGO_ERRORE = "Errore durante l'invio SetPRESTT:" + ((exSql.InnerException != null) ? exSql.InnerException.ToString() : exSql.Message.ToString());
                                log.Error("ERROR Type SqlExcetion 2: " + resMsg.MESSAGGO_ERRORE);
                                break;
                            }
                            catch (Exception ex)
                            {

                                resMsg.MESSAGGO_ERRORE = "Errore durante l'invio SetPRESTT:" + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString());
                                throw new System.Exception(resMsg.MESSAGGO_ERRORE);
                            }
                        }
                       

                    } 
                    //Prestazioni TODO 
                    else
                    {
                        //TODO errore 
                    }
                    

                }
                
               if (firstAccess)
                {
                    //todo: salvataggio da fare contestualmente alla lettura e dopo richiamo ws esposti da wso2
                    //context.AddToSOAP_INTEGRA_ADMIN(admTable);
                    //context.SaveChanges();
                }

                #endregion
            }
            catch (SqlException exSql)
            {
                log.Error("ERROR Type SqlExcetion: " +( (exSql.InnerException != null) ?  exSql.InnerException.ToString() : exSql.Message.ToString()));
                
            }
            catch (Exception ex)
            {

                log.Error("ERROR Type Excetion: " + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString()));
            }
            finally
            {
                context.SaveChanges();

                log.Debug("STOP: *********public bool ScorriEventi()*********");
            }
        }

        public static string xmlMittente()
        {
            
            SMRSRPClient client = new SMRSRPClient();

            //SetANAGT s = new SetANAGT();
            //string xml_anag = "<SetANAGT><Mittente><codiceMittente>901</codiceMittente></Mittente><DatiIdentificativiScheda><AnnoDiRiferimento>2012</AnnoDiRiferimento><CodiceRegione>010</CodiceRegione><PeriodoDiRiferimento>S1</PeriodoDiRiferimento><CodiceAziendaSanitariaDiRiferimento>202</CodiceAziendaSanitariaDiRiferimento><codiceDipartimentoSaluteMentale>D01</codiceDipartimentoSaluteMentale></DatiIdentificativiScheda><CampoTecnicoTipoMovimento><TipoMovimento>I</TipoMovimento></CampoTecnicoTipoMovimento><DatiAssistito /><DatiIntegrativiAssistito><RegioneDiResidenza>010</RegioneDiResidenza><CodiceASLDiResidenza>202</CodiceASLDiResidenza></DatiIntegrativiAssistito><DatiAnagraficiNonResidentiPiemonteNoAURA><CodiceFiscale>LEIDVD71A09F356T</CodiceFiscale></DatiAnagraficiNonResidentiPiemonteNoAURA><DatiAnagraficiAssistitiSenzaIdentificativo><Cittadinanza>IT</Cittadinanza></DatiAnagraficiAssistitiSenzaIdentificativo><CampoTecnicoTipoFlusso /></SetANAGT>";
            //object obj2 = DAOServices.DeserializeFromXmlString(xml_anag, typeof(SetANAGT));
            //s = (SetANAGT)obj2;
            
            //Mittente
            //Mittente _mittente = new Mittente();
            
            string xml_mitt = "<Mittente><codiceMittente>901</codiceMittente></Mittente>";
            object obj = DAOServices.DeserializeFromXmlString(xml_mitt, typeof(Mittente));
            ServiceSismWS.Mittente _mittente = (ServiceSismWS.Mittente)obj;

            //DatiIdentificativiScheda
            string xml_datiIdentificativiScheda = "<DatiIdentificativiScheda><AnnoDiRiferimento>2012</AnnoDiRiferimento><CodiceRegione>010</CodiceRegione><PeriodoDiRiferimento>S1</PeriodoDiRiferimento><CodiceAziendaSanitariaDiRiferimento>202</CodiceAziendaSanitariaDiRiferimento><codiceDipartimentoSaluteMentale>D01</codiceDipartimentoSaluteMentale></DatiIdentificativiScheda>";
            object obj3 = DAOServices.DeserializeFromXmlString(xml_datiIdentificativiScheda, typeof(DatiIdentificativiScheda));
            DatiIdentificativiScheda _datiIdentificativiScheda = (DatiIdentificativiScheda)obj3;

            //CampoTecnicoTipoMovimento
            string xml_campoTecnicoTipoMovimento = "<TipoMovimento>I</TipoMovimento>";
            object obj4 = DAOServices.DeserializeFromXmlString(xml_campoTecnicoTipoMovimento, typeof(TipoMovimento));
            TipoMovimento _campoTecnicoTipoMovimento = (TipoMovimento)obj4;

            StringBuilder xml_datiAssistito2 = new StringBuilder();
            xml_datiAssistito2.Append(@"<DatiAssistito>
            <!--Optional:-->
            <DatiAssistito>
               <!--anonymous type-->
               <IdentificativoAURA>123456</IdentificativoAURA>
               <!--Optional:-->
               <!--anonymous type - enumeration: [,1,2,3,4,5,6,7,9]-->
               <TitoloDiStudio>1</TitoloDiStudio>
               <!--Optional:-->
               <!--anonymous type - enumeration: [,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,99]-->
               <CodiceProfessionale>01</CodiceProfessionale>
               <!--Optional:-->
               <!--anonymous type - enumeration: [,1,2,3,4,5,6,7,8,9]-->
               <CollocazioneSocioAmbientale>1</CollocazioneSocioAmbientale>
               <!--Optional:-->
               <!--anonymous type - enumeration: [,1,2,3,4,5,6,9]-->
               <StatoCivile>1</StatoCivile>
            </DatiAssistito>
            <!--Optional:-->
            <DatiIntegrativiAssistito>
               <!--anonymous type - enumeration: [,010,020,030,041,042,050,060,070,080,090,100,110,120,130,140,150,160,170,180,190,200,098,998,999]-->
               <RegioneDiResidenza>010</RegioneDiResidenza>
               <!--anonymous type-->
               <ProvinciaComuneStatoEsteroResidenza>999999</ProvinciaComuneStatoEsteroResidenza>
               <!--anonymous type - enumeration: [,201,202,203,204,205,206,207,208,209,210,211,212,213,098,998,999]-->
               <CodiceASLDiResidenza>201</CodiceASLDiResidenza>
               <!--Optional:-->
               <!--type: string-->
               <StatoCivile>1</StatoCivile>
            </DatiIntegrativiAssistito>
            <!--Optional:-->
            <DatiAnagraficiNonResidentiPiemonteNoAURA>
               <!--anonymous type-->
               <CodiceFiscale>LEIDVD71A09E463F</CodiceFiscale>
            </DatiAnagraficiNonResidentiPiemonteNoAURA>
            <!--Optional:-->
            <DatiAnagraficiAssistitiSenzaIdentificativo>
               <!--type: string-->
               <IdentificativoAssistito>AAAA</IdentificativoAssistito>
               <!--anonymous type-->
               <Cognome>DE' ROSSI-IWANNAGONNA</Cognome>
               <!--anonymous type-->
               <Nome>MARIO</Nome>
               <!--anonymous type-->
               <DataDiNascita>29021980</DataDiNascita>
               <!--anonymous type - enumeration: [,1,2,3]-->
               <Sesso>1</Sesso>
               <!--anonymous type-->
               <ProvinciaComuneStatoEsteroNascita>999999</ProvinciaComuneStatoEsteroNascita>
               <!--anonymous type-->
               <Cittadinanza>XX</Cittadinanza>
            </DatiAnagraficiAssistitiSenzaIdentificativo>
         </DatiAssistito>");

            //DatiAssistitoElement
            //string xml_datiAssistito = "<DatiAssistito><DatiAssistito /><DatiIntegrativiAssistito><RegioneDiResidenza>010</RegioneDiResidenza><CodiceASLDiResidenza>202</CodiceASLDiResidenza></DatiIntegrativiAssistito><DatiAnagraficiNonResidentiPiemonteNoAURA><CodiceFiscale>LEIDVD71A09F356T</CodiceFiscale></DatiAnagraficiNonResidentiPiemonteNoAURA><DatiAnagraficiAssistitiSenzaIdentificativo><Cittadinanza>IT</Cittadinanza></DatiAnagraficiAssistitiSenzaIdentificativo></DatiAssistito>";
            string xml_datiAssistito = "<DatiAssistitoElement><DatiAssistito /><DatiIntegrativiAssistito><RegioneDiResidenza>010</RegioneDiResidenza><CodiceASLDiResidenza>202</CodiceASLDiResidenza></DatiIntegrativiAssistito><DatiAnagraficiNonResidentiPiemonteNoAURA><CodiceFiscale>LEIDVD71A09F356T</CodiceFiscale></DatiAnagraficiNonResidentiPiemonteNoAURA><DatiAnagraficiAssistitiSenzaIdentificativo><Cittadinanza>IT</Cittadinanza></DatiAnagraficiAssistitiSenzaIdentificativo></DatiAssistitoElement>";
           
            object obj5 = DAOServices.DeserializeFromXmlString(xml_datiAssistito, typeof(DatiAssistitoElement));
            DatiAssistitoElement _datiAssistito = (DatiAssistitoElement)obj5;

            //TipoFlusso
            string xml_campoTecnicoTipoFlusso = "<TipoFlusso>AT</TipoFlusso>";
            object obj6 = DAOServices.DeserializeFromXmlString(xml_campoTecnicoTipoFlusso, typeof(TipoFlusso));
            TipoFlusso _campoTecnicoTipoFlusso =(TipoFlusso)obj6;

            string xmlDatiIdentificativiScheda = SerializeToXmlString(_datiIdentificativiScheda);
            string xmlMittente = SerializeToXmlString(_mittente);
            string xmlTipoMovimento = SerializeToXmlString(_campoTecnicoTipoMovimento);
            string xmlDatiAssistito = SerializeToXmlString(_datiAssistito);
            string xmlTipoFlusso = SerializeToXmlString(_campoTecnicoTipoFlusso);
            //client.Endpoint.Address = new EndpointAddress("http://tst-spjb601-sl01.self.csi.it:18010/sisminvi/services"); 
            client.Endpoint.Address = new EndpointAddress("http://10.102.178.51:8280/services/sismwso2.sismwso2HttpSoap11Endpoint"); 
            int p = client.SetANAGT(_mittente, _datiIdentificativiScheda, _campoTecnicoTipoMovimento, _datiAssistito, _campoTecnicoTipoFlusso);
            return ""+p;
        }

        #endregion
    }
}